#include <string>

using std::string;
using std::to_string;

namespace Yohifo
{
    // 派发任务：加、减、乘、除、取余

    template <class T>
    class Task
    {
    public:
        Task()
        {
        }

        Task(T x, T y, char op)
            : _x(x), _y(y), _op(op), _result(T()), _ret(0)
        {
        }

        ~Task()
        {
        }

        // 通过仿函数，随机抽取运算项
        void operator()()
        {
            switch (_op)
            {
            case '+':
                _result = _x + _y;
                break;
            case '-':
                _result = _x - _y;
                break;
            case '*':
                _result = _x * _y;
                break;
            case '/':
                if (_y == 0 || _y == 0.0)
                    _ret = -1;
                else
                    _result = _x / _y;
                break;
            case '%':
                if (_y == 0 || _y == 0.0)
                    _ret = -2;
                else
                    _result = (int)_x % (int)_y;
                break;
            default:
                _ret = -3;
                break;
            }
        }

        // 查看表达式
        string getExpre() const
        {
            return to_string(_x) + _op + to_string(_y) + "=?";
        }

        // 查看运算结果
        string getOutcome() const
        {
            return to_string(_x) + _op + to_string(_y) + "=" + to_string(_result) + " (" + to_string(_ret) + ")";
        }

    private:
        T _x;
        T _y;
        T _result; // 结果
        char _op;  // 运算符
        int _ret;  // 退出码
    };
}